#include "lvgl/lvgl.h"
#include "lvgl/demos/lv_demos.h"
#include "lv_drivers/display/fbdev.h"
#include "lv_drivers/indev/evdev.h"
#include <unistd.h>
#include <pthread.h>
#include <time.h>
#include <sys/time.h>

#include "./../../inc/homepage.h"
#include "./../../inc/msg_popup.h"
#include "./../../inc/user_event.h"
#include "./../../inc/cJSON.h"
#include "./../../inc/tcp.h"

#define ULGRAY 0xF5F5F5
#define LDWHITE 0xF6F6F6
// #define LDWHITE 0xFDFDFD

// lv_obj_t * sidebar        = NULL; // 侧边栏
lv_obj_t * home_src       = NULL; // 聊天主页面
lv_obj_t * input_box      = NULL; // 输入栏
lv_obj_t * text_input     = NULL; // 输入框
lv_obj_t * char_box_title = NULL; // 聊天框标题

static lv_obj_t * chat_box = NULL; // 聊天框

static void sidebar_box_init(lv_obj_t * parent);
static void chat_box_init(lv_obj_t * parent);
static void input_box_init(lv_obj_t * parent);
static void show_new_friend_list_event_cb(lv_event_t * e);
static void log_out_event_cb(lv_event_t * e);
static void on_weather_btn_click(lv_event_t * e);

void homepage_init(void)
{
    if(home_src != NULL) {
        lv_obj_clear_flag(home_src, LV_OBJ_FLAG_HIDDEN); // 显示界面
        return;
    }

    home_src = lv_obj_create(lv_scr_act());
    lv_obj_set_size(home_src, LV_HOR_RES, LV_VER_RES);
    lv_obj_set_style_radius(home_src, 0, 0);
    lv_obj_set_style_border_width(home_src, 0, 0);
    lv_obj_set_style_pad_all(home_src, 0, 0);
    lv_obj_clear_flag(home_src, LV_OBJ_FLAG_SCROLLABLE); // 不可滚动

    sidebar_box_init(home_src);
    friend_box_init(home_src);
    // chat_box_init(home_src);

    // 分割线
    lv_obj_t * left_divider = lv_obj_create(home_src);
    lv_obj_set_pos(left_divider, LV_PCT(11), LV_PCT(0));
    lv_obj_set_size(left_divider, 1, LV_PCT(100));
    lv_obj_set_style_bg_color(left_divider, lv_color_hex(ULGRAY), 0);
    lv_obj_set_style_radius(left_divider, 0, 0);
    lv_obj_set_style_border_width(left_divider, 0, 0);

    // 分割线
    lv_obj_t * middle_divider = lv_obj_create(home_src);
    lv_obj_set_pos(middle_divider, LV_PCT(33), LV_PCT(0));
    lv_obj_set_size(middle_divider, 1, LV_PCT(100));
    lv_obj_set_style_bg_color(middle_divider, lv_color_hex(ULGRAY), 0);
    lv_obj_set_style_radius(middle_divider, 0, 0);
    lv_obj_set_style_border_width(middle_divider, 0, 0);
}

static void sidebar_box_init(lv_obj_t * parent)
{

    lv_obj_t * sidebar = lv_obj_create(parent);
    lv_obj_set_size(sidebar, LV_PCT(11), LV_PCT(100));
    lv_obj_set_pos(sidebar, LV_PCT(0), LV_PCT(0));
    lv_obj_set_style_radius(sidebar, 0, 0);
    lv_obj_set_style_border_width(sidebar, 0, 0);
    lv_obj_set_style_pad_all(sidebar, 0, 0);
    lv_obj_clear_flag(sidebar, LV_OBJ_FLAG_SCROLLABLE); // 不可滚动

    lv_obj_t * avatar_box = lv_obj_create(sidebar);
    lv_obj_set_size(avatar_box, LV_PCT(100), 90);
    lv_obj_set_style_radius(avatar_box, 0, 0);
    lv_obj_set_style_border_width(avatar_box, 0, 0);
    lv_obj_set_style_pad_all(avatar_box, 0, 0);
    lv_obj_clear_flag(avatar_box, LV_OBJ_FLAG_SCROLLABLE); // 不可滚动

    // 头像
    lv_obj_t * avatar = lv_img_create(avatar_box);
    lv_img_set_src(avatar, "S:res/ui/naim.jpg");
    lv_obj_center(avatar);

    // 下划线
    lv_obj_t * title_underline = lv_obj_create(avatar_box);
    lv_obj_set_pos(title_underline, 0, LV_PCT(99));
    lv_obj_set_size(title_underline, LV_PCT(100), 1);
    lv_obj_set_style_bg_color(title_underline, lv_color_hex(ULGRAY), 0);
    lv_obj_set_style_radius(title_underline, 0, 0);
    lv_obj_set_style_border_width(title_underline, 0, 0);

    lv_obj_t * Tool_box = lv_obj_create(sidebar);
    lv_obj_set_size(Tool_box, LV_PCT(100), 480 - 90);
    lv_obj_set_pos(Tool_box, 0, 90);
    lv_obj_set_style_radius(Tool_box, 0, 0);
    lv_obj_set_style_border_width(Tool_box, 0, 0);
    lv_obj_set_style_pad_all(Tool_box, 0, 0);
    lv_obj_clear_flag(Tool_box, LV_OBJ_FLAG_SCROLLABLE); // 不可滚动
    lv_obj_set_style_bg_opa(Tool_box, LV_OPA_0, 0);
    lv_obj_set_style_border_opa(Tool_box, LV_OPA_0, 0);

    lv_obj_t * friend_list_btn = lv_btn_create(Tool_box);
    lv_obj_set_style_bg_opa(friend_list_btn, LV_OPA_0, 0);
    lv_obj_set_style_border_opa(friend_list_btn, LV_OPA_0, 0);
    lv_obj_set_style_shadow_opa(friend_list_btn, LV_OPA_0, 0);
    lv_obj_align(friend_list_btn, LV_ALIGN_TOP_MID, 0, 10);
    lv_obj_set_size(friend_list_btn, 60, 60);

    lv_obj_t * friend_list_img = lv_img_create(friend_list_btn);
    lv_img_set_src(friend_list_img, "S:res/ui/friend_list_black.png");
    lv_obj_center(friend_list_img);

    lv_obj_add_event_cb(friend_list_btn, show_new_friend_list_event_cb, LV_EVENT_CLICKED, NULL);

    lv_obj_t * weather_btn = lv_btn_create(Tool_box);
    lv_obj_set_style_bg_opa(weather_btn, LV_OPA_0, 0);
    lv_obj_set_style_border_opa(weather_btn, LV_OPA_0, 0);
    lv_obj_set_style_shadow_opa(weather_btn, LV_OPA_0, 0);
    lv_obj_align(weather_btn, LV_ALIGN_TOP_MID, 0, 70);
    lv_obj_set_size(weather_btn, 60, 60);

    lv_obj_t * weather_img = lv_img_create(weather_btn);
    lv_img_set_src(weather_img, "S:res/ui/weather.png");
    lv_obj_center(weather_img);

    lv_obj_add_event_cb(weather_btn, on_weather_btn_click, LV_EVENT_CLICKED, NULL);

    lv_obj_t * log_out_btn = lv_btn_create(Tool_box);
    lv_obj_set_style_bg_opa(log_out_btn, LV_OPA_0, 0);
    lv_obj_set_style_border_opa(log_out_btn, LV_OPA_0, 0);
    lv_obj_set_style_shadow_opa(log_out_btn, LV_OPA_0, 0);
    lv_obj_align(log_out_btn, LV_ALIGN_BOTTOM_MID, 0, 0);
    lv_obj_set_size(log_out_btn, 60, 60);

    lv_obj_t * log_out_img = lv_img_create(log_out_btn);
    lv_img_set_src(log_out_img, "S:res/ui/log_out.png");
    lv_obj_center(log_out_img);

    lv_obj_add_event_cb(log_out_btn, log_out_event_cb, LV_EVENT_CLICKED, NULL);
}

void create_chat_box(lv_obj_t * parent)
{
    if(chat_box == NULL) {
        // printf("chat_box is NULL\n");
        chat_box_init(parent);
        // printf("chat_box is created\n");
    }
    if(chat_window != NULL) {
        // printf("chat_window is not NULL\n");
        lv_obj_clean(chat_window);
        // printf("chat_window is deleted\n");
    }
    // printf("chat_window_init start\n");
    chat_window_init(chat_box); // 创建聊天窗口
    // printf("chat_window_init over\n");
}

static void chat_box_init(lv_obj_t * parent)
{
    if(chat_box != NULL) {
    }

    chat_box = lv_obj_create(parent);
    lv_obj_set_size(chat_box, LV_PCT(67), LV_VER_RES);
    lv_obj_set_pos(chat_box, LV_PCT(33), 0);
    lv_obj_set_style_radius(chat_box, 0, 0);
    lv_obj_set_style_border_width(chat_box, 0, 0);
    lv_obj_set_style_pad_all(chat_box, 0, 0);
    lv_obj_set_style_bg_color(chat_box, lv_color_hex(LDWHITE), 0);

    lv_obj_t * title_box = lv_obj_create(chat_box);
    lv_obj_set_size(title_box, LV_PCT(100), LV_PCT(10));
    lv_obj_set_pos(title_box, 0, 0);
    lv_obj_set_style_radius(title_box, 0, 0);
    lv_obj_set_style_border_width(title_box, 0, 0);
    lv_obj_set_style_pad_all(title_box, 0, 0);
    lv_obj_clear_flag(title_box, LV_OBJ_FLAG_SCROLLABLE); // 不可滚动

    char_box_title = lv_label_create(title_box);
    lv_label_set_text(char_box_title, "xxx");
    lv_obj_center(char_box_title);
    lv_obj_set_style_text_color(char_box_title, lv_color_hex(BLACK), 0);
    lv_obj_set_style_text_font(char_box_title, &SourceHanSansCN_Bold_20, LV_PART_MAIN | LV_STATE_DEFAULT);

    // 下划线
    lv_obj_t * title_underline = lv_obj_create(title_box);
    lv_obj_set_pos(title_underline, 0, LV_PCT(99));
    lv_obj_set_size(title_underline, LV_PCT(100), 1);
    lv_obj_set_style_bg_color(title_underline, lv_color_hex(ULGRAY), 0);
    lv_obj_set_style_radius(title_underline, 0, 0);
    lv_obj_set_style_border_width(title_underline, 0, 0);

    // printf("init title_box input\n");
    input_box_init(chat_box);
}

static void input_box_init(lv_obj_t * parent)
{
    input_box = lv_obj_create(parent);
    lv_obj_set_size(input_box, LV_PCT(100), LV_PCT(10));
    lv_obj_set_pos(input_box, 0, LV_PCT(90));
    lv_obj_set_style_radius(input_box, 0, 0);
    lv_obj_set_style_border_width(input_box, 0, 0);
    lv_obj_set_style_pad_all(input_box, 0, 0);
    lv_obj_clear_flag(input_box, LV_OBJ_FLAG_SCROLLABLE); // 不可滚动
    lv_obj_set_style_bg_color(input_box, lv_color_hex(WHITE), 0);

    // 输入框
    text_input = lv_textarea_create(input_box);
    lv_obj_set_size(text_input, LV_PCT(96), LV_PCT(90));
    lv_obj_set_style_radius(text_input, 2, 0);
    lv_obj_set_style_bg_color(text_input, lv_color_hex(WHITE), 0);
    lv_obj_set_style_pad_left(text_input, 15, 0);          // 输入文本左内边距
    lv_obj_set_style_pad_right(text_input, 15, 0);         // 输入文本右内边距
    lv_obj_clear_flag(text_input, LV_OBJ_FLAG_SCROLLABLE); // 禁用输入框滚动（输入框高度固定，无需滚动）
    lv_obj_align(text_input, LV_ALIGN_LEFT_MID, LV_PCT(2), 0);
    lv_obj_set_style_border_width(text_input, 1, 0);
    lv_obj_add_event_cb(text_input, text_input_event_cb, LV_EVENT_CLICKED, NULL);
    lv_obj_set_style_text_font(text_input, &SourceHanSansCN_Bold_20, 0);

    input_keyboard = lv_chinese_ime_create(lv_scr_act());
    lv_obj_set_size(input_keyboard, LV_HOR_RES, LV_VER_RES / 5 * 2);
    lv_keyboard_set_textarea(input_keyboard, text_input);
    lv_obj_add_flag(input_keyboard, LV_OBJ_FLAG_HIDDEN);
    lv_obj_add_event_cb(text_input, text_input_event_cb, LV_EVENT_ALL, input_keyboard);
    lv_chinese_ime_set_text_font(&SourceHanSansCN_Bold_20, 0);

    // // 表情包按键
    // lv_obj_t * face_icon = lv_img_create(input_box);
    // lv_img_set_src(face_icon, "S:res/ui/face.png");
    // lv_obj_set_size(face_icon, 32, 32);
    // lv_obj_align(face_icon, LV_ALIGN_RIGHT_MID, LV_PCT(-5), 0);
}

static void show_new_friend_list_event_cb(lv_event_t * e)
{
    show_friend_apply_list();
    pack_get_friend_apply_list_json_request();
}

static void log_out_event_cb(lv_event_t * e)
{
    cJSON * log_out_root = cJSON_CreateObject();
    if(log_out_root == NULL) {
        LV_LOG_WARN("创建退出登录JSON根对象失败");
        return;
    }

    cJSON_AddStringToObject(log_out_root, "type", "log_out");
    cJSON_AddStringToObject(log_out_root, "userid", user_event.userid);

    char * log_out_json_str = cJSON_Print(log_out_root);

    if(log_out_json_str != NULL) {

        LV_LOG_INFO("退出登录JSON: %s", log_out_json_str);
        send_message_to_server(&server_info, log_out_json_str);
        free(log_out_json_str);
    }

    // 释放 cJSON 根对象内存
    cJSON_Delete(log_out_root);
}

// 打包获取好友申请列表的json请求，并发送到服务器
void pack_get_friend_apply_list_json_request()
{
    if(user_event.userid == NULL || strlen(user_event.userid) == 0) {
        return NULL;
    }

    // 创建根对象
    cJSON * root = cJSON_CreateObject();
    if(root == NULL) {
        return NULL;
    }

    // 添加type字段
    cJSON_AddStringToObject(root, "type", "get_friend_apply_list");

    // 创建payload对象
    cJSON * payload = cJSON_CreateObject();
    if(payload == NULL) {
        cJSON_Delete(root);
        return NULL;
    }

    // 向payload添加userid
    cJSON_AddStringToObject(payload, "userid", user_event.userid);

    // 将payload添加到根对象
    cJSON_AddItemToObject(root, "payload", payload);

    // 转换为字符串
    char * json_str = cJSON_PrintUnformatted(root);

    // 释放cJSON对象
    cJSON_Delete(root);

    send_message_to_server(&server_info, json_str);
}

static void on_weather_btn_click(lv_event_t * e)
{
    // 直接调用弹窗显示函数
    show_weather_popup();
}